package com.example.emos.wx.config.shrio;


import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
@Slf4j
public class JwtUtil {

    @Value("${emos.jwt.secret}")
    private String secret;

    @Value("${emos.jwt.expire}")
    private int expire;

    /**
     * 根据过期时间，秘钥和用户id生成令牌字符串
     * @param userId
     * @return
     */
    public String createToken(int userId){
        //做日期的偏移,在当前日期上面偏移五天  单位为天
        Date date = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, 5);
        //创建一个加密算法类对象
        Algorithm algorithm = Algorithm.HMAC256(secret);
        //开始执行加密
        //创建内部类对象
        JWTCreator.Builder builder = JWT.create();

        //根据秘钥 过期时间 和 userId生成字符串令牌
        String token = builder.withClaim("userId", userId).withExpiresAt(date).sign(algorithm);
        return token;
    }

    /**
     * 根据token获取到userId
     * @param token
     * @return
     */
    public int getUserId(String token){
        //解码对象
        DecodedJWT jwt = JWT.decode(token);

        int userId = jwt.getClaim("userId").asInt();

        return userId;
    }

    /**
     * 验证令牌字符串的内容和合法性
     * @param token
     */
    public void verifierToken(String token){
        //先创建一个秘钥算法对象
        Algorithm algorithm = Algorithm.HMAC256(secret);

        //将算法对象解密并创建一个验证对象
        JWTVerifier verifier = JWT.require(algorithm).build();
        verifier.verify(token);

    }

}
